from pandas import Series


class memory(object):
    def __init__(self, size):
        '''
        采用分页式管理存储--离散的存储方式
        一个单位模拟一个页 1KB所以没有FF,BF,WF,NF这样的适应算法
        :param size: 初始化存储容量大小
        '''
        self.size = size
        self.bitmap = Series(data=[0 for x in range(size)], index=[x for x in range(size)])  # 用来

    def write(self, size):
        '''
        Example:
        t = Series(index=[x for x in range(4)], data=[1,1,0,0])
        free_index = t[t == 0].index
        free = t[t == 0]
        free
        Out[13]:
        2    0
        3    0
        dtype: int64

        free_index
        Out[14]: Int64Index([2, 3], dtype='int64')
        for i in free_index:
            print(i)
            print(type(i))

        2
        <class 'int'>
        3
        <class 'int'>

        for i in range(2):
            print(free_index[i])

        2
        3

        t[free_index] = 1
        t
        Out[18]:
        0    1
        1    1
        2    1
        3    1
        dtype: int64

        free_index[0:2]
        Out[20]: Int64Index([2, 3], dtype='int64')
        t[free_index[0:2]] = 0
        t
        Out[22]:
        0    1
        1    1
        2    0
        3    0
        dtype: int64
        内存模块不管写的是什么，也不知道写的是谁的，只知道写入，表单由controller来维护
        :param size:
        :return:
        '''
        if self.size - sum(self.bitmap) >= size:
            # 如果当前的容量够分配
            # 把当前bitmap中存储为0的空间的地址取出来
            free_index = self.bitmap[self.bitmap == 0].index
            # 然后将其中size个给修改为1表示被占用,并将改进程占用的地址数组返回
            result_index = free_index[0:size]
            self.bitmap[result_index] = 1
            return result_index.tolist()
        return False

    def delete(self, index_list):
        '''
        从存储中删除数据的时候只用告诉地址，存储器不管里面存的是什么，也不关心存的是谁的，表单由controller来维护
        :param index_list: 要删除地址的表单
        :return: 删除成功返回True,否者返回 False
        '''
        try:
            self.bitmap[index_list] = 0
            return True
        except:
            print('存储删除出错')
        finally:
            return False
